Titre

------------------------------- Chapitre II - Quelques principes -------------------------------

Menus

Bon, nous n'avons plus de nagscreen, plus de problème de temps mais il nous manque encore des fonctions :

Menus grayed

Avant de prendre Olly, nous allons essayer un petit utilitaire qui peut s'avérer très pratique. Il s'agit de ResHacker, un éditeur de ressources, qui permet non seulement de voir mais aussi de modifier les fenêtres, menus, icônes, images ... contenus dans un programme. Ouvrez le et chargez XTX-RegMe_NoEval.exe :

ResHacker

Sur le côté gauche (1), vous pouvez voir l'arborescence des ressources. En ouvrant les dossiers et en cliquant sur les icônes, vous avez sur le côté droit (2) soit une image (pour un bmp par exemple) soit un descriptif (pour un menu par exemple) ainsi qu'un aperçu fonctionnel (3). Ici, nous voyons les commandes des deux listes déroulantes "Fichier" (Enregistrer, Enregistrer sous ... et Fermer) et "Aide" (Licence, A propos de ...). A côté de chacune d'elles, le chiffre représente son identifiant (ID). Notez ceux qui nous intéressent (10001 & 10002) cela pourra nous servir plus tard. Comme vous pouvez le voir dans l'aperçu (3), les commandes Enregistrer et Enregistrer sous ... sont actives. Si elles avaient été créées non actives, nous aurions à coté de chacune d'elles la mention GRAYED (grisée) ou DISABLED (désactivée). Grâce à ResHacker, nous aurions pu tout simplement effacer ces mentions et enregistrer les modifications. Vu que ce n'est pas le cas, nous allons reprendre Olly.

Chargez XTX-RegMe_NoEval.exe. Vérifiez qu'il ne reste aucun BP ( ALT+B ou ALT+B). CTRL+N (ou clic droit Search for, Names) et regardons de nouveau les APIs présentes. L'une d'elles devrait retenir votre attention : EnableMenuItem (puisqu'elle parle de menu). Effectivement, cette API s'occupe uniquement d'activer ou désactiver des éléments de menusSélectionnez-la, CTRL+R (ou Find references). Double cliquez sur la première référence et regardons où cela nous mène :

Call EnableMenuItem

Déjà, vous pouvez vous apercevoir que les 3 références trouvées pour cette API sont toutes regroupées ici. Jetons un œil aux arguments ( 1) poussés sur la pile avant l'appel. Nous avons l'Item. Ce chiffre (10001) ne vous rappelle rien ? C'est l'ID de la commande Enregistrez que nous a montré ResHacker (si vous regardez en dessous, vous verrez que le CALL suivant concerne Enregistrez sous ... (10002)). Ensuite le Flag. C'est lui qui va déterminer comment sera l'élément de menu. Il existe 4 possibilités :

Pour MF_GRAYED, cela correspond à PUSH 1 (2), il nous suffit donc de le modifier en PUSH 0. Ne vous précipitez pas sur la boite de dialogue Assemble, nous n'allons pas l'utiliser cette fois ci. En effet, il s'agit là d'un PUSH BYTE (taille de la valeur à pousser) dont l'opcode est 6A01 et avec Assemble (sous Olly v2), le PUSH va être traduit avec l'opcode 68 00000000 (opcode du PUSH DWORD) ce qui va provoquer un conflit de taille. Nous allons utiliser le binary edit qui nous permet de modifier le code hexadécimal. Clic droit sur la ligne du PUSH, Edit, Binary edit... (ou CTRL+E) :

Binary edit

et voici la fenêtre que nous obtenons :

Code hexa edit

Modifiez le 1 en zéro (vérifiez que Keep size soit coché) et cliquez sur OK. Le PUSH a bien été modifié mais l'argument n'apparaît pas. Faîtes CTRL+A pour forcer Olly à effectuer une nouvelle analyse et vous aurez :

Push 0

Modifiez de la même manière les deux autres appels à EnableMenuItem, F9 (ou F9). Vérifiez le menu "Fichier" :

Menus actifs

Cliquez sur l'une des deux commandes pour vérifier :

Enregistrer activé

Nos menus sont bien actifs, le but est atteint. Mais n'y avait-il pas plus simple ? Fermez la boite de dialogue (pas le programme), faites CTRL+F2 ou CTRL+F2) pour annuler nos modifications, et revenez à nos appels à EnableMenuItem. Examinons un peu le code de cette procédure (délimitée par le crochet dans la marge (1)).

Les deux premières lignes (2) ne nous intéressent pas. Il s'agit du début classique d'une procédure (ces deux instructions servent à sauvegarder la pile et à faire une pile "vide" au-dessus). Nous avons ensuite une valeur transférer dans EAX (3) puis une comparaison entre AL et 0 (4) (souvenez-vous, AL est la partie basse de AX, lui-même étant le registre 16 bits de EAX), suivi d'un saut. Si ce JNE n'est pas pris, nous passons par l'API qui va grisée nos deux éléments de menus puis nous arrivons sur un LEAVE qui restaure la pile et un RET (5) qui nous sort de la procédure. Si le saut est effectué, nous arrivons sur une nouvelle paire CMP AL,1 / JNE (6). Cette fois-ci, si AL est égal à 1, une seule entrée du menu sera grisée (10002 = Enregistrez sous ...)(7) avant de sortir via le RET. Suivons le saut et nouvelle paire CMP AL,2 / JNE (8), suivi directement du LEAVE et du RET (9). Il ne fait donc rien sur nos entrées de menu :

Procedure menu

Nous avons vu dans ResHacker que celles-ci étaient actives à la création, il suffit donc d'avoir AL = 2 pour qu'elles restent activées. Et ça tombe bien, au début de la procédure, nous avons justement une ligne qui donne sa valeur à EAX (3) :

0040258D    MOV EAX,DWORD PTR DS:[XTX-RegMe_NoEval.404870]

nous allons la modifier en :

0040258D    MOV EAX, 2

Clic droit sur la ligne, Assemble (ou touche Espace), remplacez DWORD PTR DS:[XTX-RegMe_NoEval.404870] par 2, vérifiez que Keep size et Fill with NOPs soient cochés, OK, F9 (ou F9) et vous pouvez vérifier que vos entrées de menu sont actives en ayant modifié qu'une seule ligne au lieu de trois précédemment.

Sélectionnez la ligne modifiée et enregistrez la nouvelle version sous XTX-RegMe_MenuOn.exe.

Et si maintenant nous nous occupions du titre.

 

 

Precedent        Sommaire        Suivant